const qianwenService = require('./qianwen');
const fileCache = require('./fileCache');
const mbtiService = require('./mbtiService');
const { TEST_STATUS } = require('./mbtiService');

// 生成编程卡片
async function generateProgrammingCard(parameters) {
  const { query } = parameters;
  
  // 先查询缓存
  const cachedCard = await fileCache.getCard('programming', parameters);
  if (cachedCard) {
    return cachedCard;
  }
  
  const prompt = `你是一位风趣幽默的少儿编程启蒙导师，孩子们都叫你"代码魔法师"。请为编程概念"${query}"创建一个思维积木介绍页面。

要求：
1. 使用HTML格式输出，包含以下部分：
   - 思维积木主题（使用h1标签）
   - 积木蓝图（使用SVG绘制流程图或积木示意图）
   - 积木说明书（使用section标签）
   - 生活中的代码（使用section标签，包含3个例子）
   - 思维积木游戏（使用section标签）
   - 编程小问号（使用section标签）

2. 样式要求：
   - 使用现代CSS，包含响应式设计
   - 使用柔和的颜色和圆角设计
   - 添加简单的动画效果
   - 确保移动端友好

3. 内容要求：
   - 使用生活化的比喻解释概念
   - 提供3个具体的生活实例
   - 设计一个简单的互动游戏，游戏就在页面内可运行
   - 提出一个思考题

4. 输出格式：
   - 返回完整的HTML代码
   - 包含内联CSS样式
   - 使用语义化HTML标签
   - SVG必须是原创绘制

请直接返回HTML代码，不需要其他解释。`;

  try {
    const response = await qianwenService.generateContent(prompt);
    const result = {
      type: 'programming',
      title: `编程思维积木：${query}`,
      content: response,
      timestamp: new Date().toISOString()
    };
    
    // 保存到缓存
    await fileCache.saveCard('programming', parameters, result);
    
    return result;
  } catch (error) {
    console.error('生成编程卡片失败:', error);
    throw new Error('生成编程思维积木失败，请稍后重试');
  }
}

// 生成古诗词卡片
async function generatePoemCard(parameters) {
  const { query } = parameters;
  console.log(`开始生成古诗词卡片: ${query}`);
  
  // 先查询缓存
  const cachedCard = await fileCache.getCard('poem', parameters);
  if (cachedCard) {
    return cachedCard;
  }
  
  const prompt = `你是一位拥有三十年以上教学经验的资深语文老师，专注于中国古典诗词的教学。请为诗词"${query}"创建一个古诗词学习卡片。

要求：
1. 使用HTML格式输出，包含以下部分：
   - 标题（使用h1标签，包含诗词名）
   - 作者信息（使用h2标签，包含朝代）
   - 原文（使用section标签，每句单独一行）
   - 注释（使用section标签，列出难词解释）
   - 翻译（使用section标签，现代汉语翻译）
   - 意境描述（使用section标签，带领学生走进诗词意境）
   - 意境分析（使用section标签，分析意境和情感）
   - 写作手法（使用section标签，列出2-3种主要手法）
   - 创作背景（使用section标签，简述背景）
   - 名句品鉴（使用section标签，分析1-2句经典名句）
   - 延伸阅读（使用section标签，推荐相关诗词）

2. 样式要求：
   - 使用中国风设计元素
   - 适当的留白和间距
   - 工整的字体排版
   - 优雅的配色方案
   - 响应式设计，确保移动端友好

3. 内容要求：
   - 注释要准确易懂
   - 翻译要流畅自然
   - 意境描述要生动形象
   - 分析要深入浅出
   - 延伸阅读要有相关性

4. 输出格式：
   - 返回完整的HTML代码
   - 包含内联CSS样式
   - 使用语义化HTML标签
   - 确保排版美观

请直接返回HTML代码，不需要其他解释。`;

  try {
    console.log('正在调用千问API生成内容...');
    const response = await qianwenService.generateContent(prompt);
    console.log('千问API返回内容成功，正在处理...');
    
    const result = {
      type: 'poem',
      title: `古诗词学习：${query}`,
      content: response,
      timestamp: new Date().toISOString()
    };
    
    // 保存到缓存
    await fileCache.saveCard('poem', parameters, result);
    
    console.log('古诗词卡片生成完成');
    return result;
  } catch (error) {
    console.error('生成古诗词卡片失败:', error);
    throw new Error(`生成古诗词学习卡片失败: ${error.message}`);
  }
}

// 生成职业卡片
async function generateCareerCard(parameters) {
  const { query } = parameters;
  
  const prompt = `你是一位充满想象力的职业启蒙导师，擅长用生动有趣的方式向孩子们介绍各种职业。请为职业"${query}"创建一个职业体验站通行证。

要求：
1. 使用HTML格式输出，包含以下部分：
   - 职业名称（使用h1标签，醒目展示）
   - 职业徽章（使用SVG绘制代表该职业的工具或标志性物品）
   - 我的工作是...（使用section标签，1-2句简单描述）
   - 酷炫工具/装备（使用section标签，列举1-2个有趣工具）
   - 为什么需要我？（使用section标签，说明职业价值）
   - 超棒技能（使用section标签，列出1-2项有趣技能）
   - 未来体验官（使用section标签，设计一个思考问题）

2. 样式要求：
   - 使用现代卡片设计
   - 添加适当的动画效果
   - 使用明亮的配色方案
   - 确保移动端友好
   - 设计要活泼有趣，适合儿童

3. 内容要求：
   - 使用简单易懂的语言
   - 突出职业的有趣之处
   - 强调职业的社会价值
   - 鼓励孩子思考和想象
   - 避免过于专业或复杂的描述

4. 输出格式：
   - 返回完整的HTML代码
   - 包含内联CSS样式
   - 使用语义化HTML标签
   - SVG必须是原创绘制

请直接返回HTML代码，不需要其他解释。`;

  try {
    const response = await qianwenService.generateContent(prompt);
    return {
      type: 'career',
      title: `职业体验站：${query}`,
      content: response,
      timestamp: new Date().toISOString()
    };
  } catch (error) {
    console.error('生成职业卡片失败:', error);
    throw new Error('生成职业体验站通行证失败，请稍后重试');
  }
}

// 定义历史对照类别
const HISTORY_CATEGORIES = [
  '科技发展',
  '艺术发展',
  '哲学思想',
  '医学发展',
  '建筑发展'
];

async function generateHistoryCard(parameters) {
  const { category } = parameters;
  
  // 先查询缓存
  const cachedCard = await fileCache.getCard('history', parameters);
  if (cachedCard) {
    return cachedCard;
  }
  
  if (!HISTORY_CATEGORIES.includes(category)) {
    throw new Error('无效的历史对照类别');
  }
  
  const prompt = `你是一位专业的历史学者，擅长中西方历史对比研究。请为中西方${category}对照创建一个时间轴页面。

要求：
1. 使用HTML格式输出，包含以下部分：
   - 标题（使用h1标签，包含"中西方${category}对照时间轴"）
   - 时间轴（使用SVG绘制垂直时间轴）
   - 历史事件节点（左右两侧各不少于10个关键节点）
   - 每个节点包含：
     * 年份
     * 事件标题
     * 详细描述
     * 历史影响

2. 样式要求：
   - 现代简约风格设计
   - 垂直时间轴居中
   - 左侧展示中国历史
   - 右侧展示西方历史
   - 使用柔和的配色方案
   - 添加交互动画效果
   - 确保移动端友好

3. 交互要求：
   - 时间节点使用卡片形式
   - 悬停时显示更多细节
   - 点击可固定显示
   - 添加平滑滚动效果
   - 时间轴要有呼吸感

4. 内容要求：
   - 选择最具代表性的历史事件
   - 确保时间跨度合理
   - 突出重要历史节点
   - 保持描述简洁清晰
   - 注意时间对应关系

5. 输出格式：
   - 返回完整的HTML代码
   - 包含内联CSS样式
   - 使用语义化HTML标签
   - 添加必要的JavaScript交互代码

请直接返回HTML代码，不需要其他解释。`;

  try {
    const response = await qianwenService.generateContent(prompt);
    const result = {
      type: 'history',
      title: `中西方${category}对照`,
      content: response,
      timestamp: new Date().toISOString()
    };
    
    // 保存到缓存
    await fileCache.saveCard('history', parameters, result);
    
    return result;
  } catch (error) {
    console.error('生成历史对照卡片失败:', error);
    throw new Error('生成历史对照时间轴失败，请稍后重试');
  }
}

// 生成科学卡片
async function generateScienceCard(parameters) {
  const { query } = parameters;
  
  // 先查询缓存
  const cachedCard = await fileCache.getCard('science', parameters);
  if (cachedCard) {
    return cachedCard;
  }
  
  if (!query) {
    throw new Error('请输入一个科学概念或现象');
  }
  
  const prompt = `你是一位专门为5-12岁儿童创作科学科普内容的专家，拥有深厚的科学知识和丰富的儿童教育经验。请为科学概念"${query}"创建一个生动有趣的科普页面。

要求：
1. 使用HTML格式输出，包含以下部分：
   - 引人入胜的标题（使用h1标签，提出有趣的问题或使用吸引人的短语）
   - 这是什么？（使用section标签，用1-2句简单的话解释概念）
   - 它是如何运作的？（使用section标签，分3-4步解释原理）
   - 生活中的例子（使用section标签，列举1-2个日常例子）
   - 动手试一试（使用section标签，提供1个简单安全的实验）
   - 你知道吗？（使用section标签，分享1个有趣的小知识）
   - 想一想（使用section标签，提出1个思考题）

2. 样式要求：
   - 使用明亮活泼的配色
   - 添加可爱的图标和插图
   - 使用圆角和柔和的阴影
   - 添加简单的动画效果
   - 确保移动端友好
   - 适合儿童阅读的字体大小

3. 内容要求：
   - 使用简单易懂的语言
   - 避免专业术语
   - 使用生动的比喻
   - 突出趣味性
   - 强调安全性
   - 鼓励动手实践
   - 激发好奇心

4. 安全要求：
   - 实验必须安全简单
   - 明确标注需要大人帮助
   - 提供安全提示
   - 避免危险材料
   - 强调安全第一

5. 输出格式：
   - 返回完整的HTML代码
   - 包含内联CSS样式
   - 使用语义化HTML标签
   - 添加必要的图标和插图
   - 确保内容科学准确

请直接返回HTML代码，不需要其他解释。`;

  try {
    const response = await qianwenService.generateContent(prompt);
    const result = {
      type: 'science',
      title: `科学探索：${query}`,
      content: response,
      timestamp: new Date().toISOString()
    };
    
    // 保存到缓存
    await fileCache.saveCard('science', parameters, result);
    
    return result;
  } catch (error) {
    console.error('生成科学卡片失败:', error);
    throw new Error('生成科学探索卡片失败，请稍后重试');
  }
}

const generateMBTITestCard = async (parameters) => {
  const { sessionId, questionNumber, answer, action = 'continue' } = parameters;
  
  if (!sessionId) {
    throw new Error('需要提供sessionId');
  }

  // 处理不同的操作类型
  switch (action) {
    case 'start':
      try {
        // 直接开始新测试，不需要先检查状态
        const newStatus = await mbtiService.startTest(sessionId);
        
        // 等待状态完全保存
        let retryCount = 0;
        let updatedStatus;
        while (retryCount < 3) {
          await new Promise(resolve => setTimeout(resolve, 200)); // 增加等待时间
          updatedStatus = await mbtiService.getTestStatus(sessionId);
          if (updatedStatus && updatedStatus.status === TEST_STATUS.IN_PROGRESS) {
            break;
          }
          retryCount++;
        }
        
        if (!updatedStatus || updatedStatus.status !== TEST_STATUS.IN_PROGRESS) {
          throw new Error('测试状态更新失败，请重试');
        }

        // 获取第一个问题
        const firstQuestion = await mbtiService.getNextQuestion(sessionId, 0, []);
        if (!firstQuestion) {
          throw new Error('获取第一个问题失败，请重试');
        }

        return {
          type: 'mbti_test',
          content: {
            testStatus: {
              status: TEST_STATUS.IN_PROGRESS,
              currentQuestion: 1,
              totalQuestions: firstQuestion.totalQuestions,
              answeredQuestions: 0
            },
            question: firstQuestion
          }
        };
      } catch (error) {
        console.error('开始测试失败:', error);
        throw new Error(`开始测试失败: ${error.message}`);
      }
      
    case 'reset':
      // 重置测试
      await mbtiService.resetTest(sessionId);
      const resetQuestion = await mbtiService.getNextQuestion(sessionId, 0, []);
      return {
        type: 'mbti_test',
        content: {
          testStatus: TEST_STATUS.IN_PROGRESS,
          question: resetQuestion
        }
      };
      
    case 'continue':
      // 继续测试
      const status = await mbtiService.getTestStatus(sessionId);
      if (status.status === TEST_STATUS.COMPLETED) {
        // 如果测试已完成，返回结果
        const result = await mbtiService.calculateMBTIType(sessionId);
        return {
          type: 'mbti_result',
          content: result
        };
      }
      
      // 获取当前问题
      const currentQuestion = await mbtiService.getNextQuestion(
        sessionId, 
        status.currentQuestion - 1,
        status.answers || []
      );
      return {
        type: 'mbti_test',
        content: {
          testStatus: status.status,
          question: currentQuestion
        }
      };
      
    case 'answer':
      // 提交答案
      if (!answer || !questionNumber) {
        throw new Error('需要提供答案和问题编号');
      }
      
      // 保存答案
      const saveResult = await mbtiService.saveAnswer(sessionId, questionNumber, answer);
      
      // 检查是否完成所有问题
      if (saveResult.status.answeredQuestions >= saveResult.status.totalQuestions) {
        console.log('测试完成，计算MBTI类型');
        // 计算MBTI类型
        const result = await mbtiService.calculateMBTIType(sessionId);
        return {
          type: 'mbti_result',
          content: result
        };
      }
      
      // 获取下一个问题
      const nextQuestion = await mbtiService.getNextQuestion(
        sessionId,
        saveResult.status.currentQuestion - 1,
        saveResult.status.answers || []
      );

      // 如果下一个问题是结果类型，直接返回
      if (nextQuestion.type === 'mbti_result') {
        console.log('获取到测试结果');
        return {
          type: 'mbti_result',
          content: await mbtiService.calculateMBTIType(sessionId)
        };
      }

      // 获取最新的测试状态
      const updatedStatus = await mbtiService.getTestStatus(sessionId);
      
      return {
        type: 'mbti_test',
        content: {
          testStatus: {
            status: updatedStatus.status,
            currentQuestion: updatedStatus.currentQuestion,
            totalQuestions: updatedStatus.totalQuestions,
            answeredQuestions: updatedStatus.answeredQuestions,
            dimensionProgress: updatedStatus.dimensionProgress || {},
            lastAnsweredQuestion: questionNumber
          },
          question: nextQuestion
        }
      };
      
    default:
      throw new Error('无效的操作类型');
  }
};

const generateCareerMatchCard = async (parameters) => {
  console.log('generateCareerMatchCard 参数:', parameters);
  const { mbtiType, careerPreferences } = parameters;
  
  if (!mbtiType) {
    console.error('generateCareerMatchCard: 缺少MBTI类型');
    return {
      type: 'career_match',
      content: {
        status: 'error',
        message: '需要提供MBTI类型才能进行职业匹配分析'
      }
    };
  }

  console.log('开始生成职业分析，MBTI类型:', mbtiType);
  // 生成职业匹配分析
  const analysis = await mbtiService.generateCareerAnalysis(mbtiType, careerPreferences);
  console.log('生成职业分析结果:', analysis);
  
  const result = {
    type: 'career_match',
    content: {
      status: 'success',
      mbtiType,
      analysis
    }
  };
  console.log('返回职业匹配卡片:', result);
  return result;
};

// 导出历史对照类别供前端使用
module.exports = {
  generateProgrammingCard,
  generatePoemCard,
  generateCareerCard,
  generateHistoryCard,
  generateScienceCard,
  HISTORY_CATEGORIES,
  generateMBTITestCard,
  generateCareerMatchCard
}; 